/* 使用结构链表
 * 编写一个程序：让用户输入一年内看过的所有电影
 * 要存储每部电影的各种信息：如名片、发行年份、导演、主演、片长、影片的种类、评级等
 * 使用一个结构存储每部电影
 * 链表中存储一年内看过的电影
 */

#include <stdio.h>
#include <stdlib.h>      //提供 malloc() 原型
#include <string.h>      //提供 strcpy() 原型
#define TSIZE    45      //存储名片的数组大小

struct film {
    char title[TSIZE];//电影的片名
    int rating;//电影的评分
    struct film * next;  //指向链表中的下一个结构的指针
};

extern char * s_gets(char * st, int n);

void filmMain3(void)
{
    struct film * head = NULL;//头指针：存储第 1 个结构的地址
    struct film * prev = NULL, * current;
    char input[TSIZE];
    
    //收集从并存储信息
    puts("输入第一部电影标题:");
    while (s_gets(input, TSIZE) != NULL && input[0] != '\0')
    {
        current = (struct film *) malloc(sizeof(struct film));//使用 malloc() 为结构分配内存空间
        if (head == NULL)       //第一个结构
            head = current;//头指针赋值
        else                    //后续结构
            prev->next = current;
        current->next = NULL;//该结构后面没有其他结构，将 next 设置为 NULL
        strcpy(current->title, input);//strcpy() 函数把整个字符串从临时数组拷贝至目标数组，strcpy() 相当于字符串赋值运算符
        puts("输入你的评价等级 <0-10>:");
        scanf("%d", &current->rating);//存储评分
        while(getchar() != '\n')
            continue;
        puts("输入下一个电影标题 (遇到空行停止):");
        prev = current;
    }
    
    /* 显示电影链表
     * 从第一个指针位置开始
     * 然后使用指针表示法访问结构成员
     *
     * 注意：head 头指针确定后不能改变 head 值，否则导致程序找不到链表的开始处；
     */
    if (head == NULL)
        printf("没有数据输入. ");
    else
        printf ("以下是电影列表:\n");
    current = head;
    while (current != NULL)
    {
        printf("电影: %s  评价: %d\n",current->title, current->rating);//指针表示法访问结构成员
        current = current->next;//根据 next 的信息，重设 current 指向链表中的下一个结构
    }
    
    //完成任务，释放分配的内存
    current = head;
    while (current != NULL)
    {
        free(current);
        current = current->next;
    }
    printf("结束 !\n");
}

